ホームに戻る
出典 :
関連 :
目次 :
※この記事は書きかけです。
VBAからテーブルを操作する
テーブルはVBAと相性が良く、セル範囲をテーブル化することでセルの絶対位置(アドレス)を考慮せずにデータの操作が可能となる。
テーブルの操作は ListObject を介して行う。
尚、テーブルについてはリンク先を参照のこと。
ListObject と ListObjects
ひとつのテーブルはひとつの ListObject に紐づけられる。
ひとつのワークシートには複数のテーブルを作成することができ、ワークシートに存在するテーブル( ListObject )を束ねたコレクションが ListObjects である。
Sub DoSomething()
' テーブル範囲を格納する tbl 変数の宣言
Dim tbl As ListObject
' アクティヴなシートの「テーブル1」を tbl に格納
Set tbl = ActiveSheet.ListObjects("テーブル1")
:
End Sub
ListObjects はシート( WorkSheet )のプロパティであり、テーブル名を指定することで特定のテーブルに紐づく ListObject が取得できる。
テーブルの作成
' テーブルの初期化
Private Sub InitializeTable()
' 見出し行を作成
Cells(ROW_HEADER, E_Col.Folder).Value = "フォルダ"
Cells(ROW_HEADER, E_Col.Filename).Value = "ファイル名"
Cells(ROW_HEADER, E_Col.Schema).Value = "スキーマ"
Cells(ROW_HEADER, E_Col.Name_P).Value = "物理名称"
Cells(ROW_HEADER, E_Col.Name_L).Value = "論理名称"
Cells(ROW_HEADER, E_Col.ObjCode).Value = "オブジェクトコード"
Cells(ROW_HEADER, E_Col.Attr).Value = "属性"
' テーブルを作成
Dim ddTable As ListObject
Set ddTable = ListObjects.Add(SourceType:=xlSrcRange, _
Source:=Range(Cells(ROW_HEADER, E_Col.Folder).Address).CurrentRegion, _
XlListObjectHasHeaders:=xlYes)
' テーブル名、テーブルスタイルを設定
ddTable.Name = "目録"
ddTable.TableStyle = "TableStyleLight2"
End Sub
上記は、テーブルを新規作成する例である。
プロシージャ InitializeTable() はワークシートのメンバとして定義されており、ListObjects は「自身(シート)の ListObjects 」を指す。
ここでは、まず見出し行を作成し、作成した見出し行をテーブルに変換している。
ListObjects.Add() はワークシートにテーブルを追加するメソッドで、ここでは以下のパラメータを指定している。
SourceType 元データの種類 |
xlSrcRange セル範囲 |
Source 元データ |
Range(Cells(ROW_HEADER, E_Col.Folder).Address).CurrentRegion
Cells(ROW_HEADER, E_Col.Folder) が含まれる範囲 |
XlListObjectHasHeaders 見出し行を作成するか |
xlYes はい |
テーブル名は Add() のパラメータには含まれないため、作成後に付与する。
テーブルのセルを参照・更新
Sub DoSomething()
' テーブル「目録」を tbl に関連付ける
Dim tbl As ListObject
Set tbl = ListObjects("目録")
' 列「列1」の 6 行目に「い」を格納
tbl.ListColumns("列1").Range(6) = "い"
' 列「列2」の 5 行目の値を取得
Dim val
val = tbl.ListColumns("列2").Range(5)
End Sub
テーブルの破棄
Sub DoSomething()
' 既存のテーブルを全て削除
Dim lob As ListObject
For Each lob In ListObjects
lob.Delete
Next
End Sub
理想的な構成
テーブル(およびワークシート)を使用する際は、以下を原則とすることで効率よくデータを管理することができる。
(特にVBAとの連携時)
- ひとつのワークシートに複数のテーブルを作らない(1シート1テーブル)
- 先頭行は見出し、2行目以降に実データを格納する(見出し行を必ず設ける)
- テーブル外のセル範囲にデータを入れない